package cn.tedu.smartos.baseuser.service.impl;

import cn.tedu.smartos.base.exception.ServiceException;
import cn.tedu.smartos.base.response.StatusCode;
import cn.tedu.smartos.base.utils.user.JsonUtils;
import cn.tedu.smartos.base.utils.user.JwtTokenUtil;
import cn.tedu.smartos.baseuser.mapper.UserMapper;
import cn.tedu.smartos.baseuser.pojo.dto.UpdatePasswordParam;
import cn.tedu.smartos.baseuser.pojo.dto.UserSaveParam;
import cn.tedu.smartos.baseuser.pojo.dto.UserLoginParam;
import cn.tedu.smartos.baseuser.pojo.entity.User;
import cn.tedu.smartos.baseuser.pojo.vo.UserVO;
import cn.tedu.smartos.baseuser.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;

import java.text.SimpleDateFormat;
import java.util.*;

import static cn.tedu.smartos.base.utils.user.JsonUtils.listToJson;

@Slf4j
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    @Autowired
    private RedisTemplate<String, Serializable> redisTemplate;
    /**
     * author: 杨平
     * 用户注册
     */
    @Override
    public void register(UserSaveParam regParam) {
        log.debug("处理用户注册业务:{}",regParam);
        //  根据用户名查询用户是否存在
        Integer rows = userMapper.findByUsername(regParam.getUsername());
        if (rows > 0){
            throw new ServiceException(StatusCode.USER_EXIT);
        }
        //  封装数据
        User user = new User();
        BeanUtils.copyProperties(regParam,user);
        user.setRegisterTime(new Date());
        user.setStatus(1);
        user.setIsDeleted(0);
        user.setPermission("0");
        user.setUpdateTime(new Date());

        //  将用户注册数据插入数据库
        Integer rows2 = userMapper.userInsert(user);
        if (rows2 != 1){
            throw new ServiceException("注册失败");
        }
    }

    /**
     * author: 杨平
     * 用户登录
     */
 //   @Override
//    public Map<String, Object> login(UserLoginParam loginParam) {
//        log.debug("处理用户登录业务:{}", loginParam);
//
//        // 根据用户名查询用户是否存在
//        Integer rows = userMapper.findByUsername(loginParam.getUsername());
//        if (rows == 0) {
//            throw new ServiceException(StatusCode.USER_NOT_EXIT);
//        }
//
//
//        // 用户名密码登录
//        UserVO userVO = userMapper.loginByUsernameAndPassword(loginParam);
//        if (userVO == null) {
//            throw new ServiceException(StatusCode.USERNAME_OR_PASSWORD_ERROR);
//        }
//        log.debug("用户登录成功:{}", userVO);
//         Integer row =userMapper.updateLastLoginTime(userVO.getUserId());
//         if (row != 1){
//             throw new ServiceException(StatusCode.FAILED,"更新登录时间失败");
//         }
//        // 生成Token
//        String token = jwtTokenUtil.generateToken(userVO.getUsername());
//
//        // 使用Map封装返回数据
//        Map<String, Object> data = new HashMap<>();
//        data.put("user", userVO);
//        data.put("token", token);
//
//        // 使用JsonResult.ok()静态方法返回成功响应
//
//
//
//        return data;
//    }
//@Override
//public Map<String, Object> login(UserLoginParam loginParam) {
//    log.debug("处理用户登录业务:{}", loginParam);
//
//    UserVO userVO = null;
//    if (loginParam.getUsername() != null && !loginParam.getUsername().isEmpty()) {
//        // 用户名登录
//        userVO = userMapper.loginByUsernameAndPassword(loginParam);
//    } else if (loginParam.getPhone() != null && !loginParam.getPhone().isEmpty()) {
//        // 手机号登录
//        userVO = userMapper.loginByPhoneAndPassword(loginParam);
//    } else if (loginParam.getEmail() != null && !loginParam.getEmail().isEmpty()) {
//        // 邮箱登录
//        userVO = userMapper.loginByEmailAndPassword(loginParam);
//    }
//
//    if (userVO == null) {
//        throw new ServiceException(StatusCode.USERNAME_OR_PASSWORD_ERROR);
//    }
//    log.debug("用户登录成功:{}", userVO);
//             Integer row =userMapper.updateLastLoginTime(userVO.getUserId());
//         if (row != 1){
//             throw new ServiceException(StatusCode.FAILED,"更新登录时间失败");
//         }
//   //  生成Token
//        String token = jwtTokenUtil.generateToken(userVO.getUsername());
//        // 使用Map封装返回数据
//        Map<String, Object> data = new HashMap<>();
//        data.put("user", userVO);
//        data.put("token", token);
//
//        // 使用JsonResult.ok()静态方法返回成功响应
//        return data;
//}

    @Override
    public Map<String, Object> login(UserLoginParam loginParam) {
        log.debug("处理用户登录业务:{}", loginParam);

        UserVO userVO = null;
        if (loginParam.getUsername() != null && !loginParam.getUsername().isEmpty()) {
            // 用户名登录
            userVO = userMapper.loginByUsernameAndPassword(loginParam);
        } else if (loginParam.getPhone() != null && !loginParam.getPhone().isEmpty()) {
            // 手机号登录
            userVO = userMapper.loginByPhoneAndPassword(loginParam);
        } else if (loginParam.getEmail() != null && !loginParam.getEmail().isEmpty()) {
            // 邮箱登录
            userVO = userMapper.loginByEmailAndPassword(loginParam);
        }

        if (userVO == null) {
            throw new ServiceException(StatusCode.USERNAME_OR_PASSWORD_ERROR);
        }
        log.debug("用户登录成功:{}", userVO);
        Integer row = userMapper.updateLastLoginTime(userVO.getUserId());
        if (row != 1) {
            throw new ServiceException(StatusCode.FAILED, "更新登录时间失败");
        }

        // 生成Token
        String token = jwtTokenUtil.generateToken(userVO.getUsername());

        // 使用Map封装返回数据
        Map<String, Object> data = new HashMap<>();
        data.put("user", userVO);
        data.put("token", token);

        return data;
    }

    /**
     * 忘记密码
     * @param userId, password, email, code
     */
    @Override
    public void forget(Long userId,String password,String email,String code) {
        String redisCode = (String) redisTemplate.opsForValue().get(email);
        if (redisCode == null || !redisCode.equals(code)) {
            throw new ServiceException(StatusCode.FAILED,"验证码错误");
        }
        //  更新密码
        UpdatePasswordParam param = new UpdatePasswordParam();
        param.setUserId(userId);
        param.setPassword(password);
        Integer rows = userMapper.updatePassword(param);
        if (rows != 1) {
            throw new ServiceException(StatusCode.FAILED,"修改密码失败");
        }
    }
    @Override
    public User getUserByUsername(String username) {
        log.debug("开始处理【通过用户名获取用户信息】的业务,参数:{}", username);
        return userMapper.selectByUsername(username);
    }
    @Override
    public Integer findByUsername(String username){
        Integer rows = userMapper.findByUsername(username);
        return rows;
    }
    @Override
    public Integer countByPhone(String phone){
        Integer rows = userMapper.findByPhone(phone);
        return rows;
    }

    @Override
    public Integer findByIdCard(String idCard){
        Integer rows = userMapper.findByIdCard(idCard);
        return rows;
    }
    @Override
    public void updateIdentify(UserSaveParam param) {
        log.debug("开始处理用户信息业务:{}",param);
        User user = new User();
        BeanUtils.copyProperties(param,user);
        // 保存用户信息时
        // 显式转换 List<String> 并调用 JsonUtils.listToJson
        user.setIdCardUrl(JsonUtils.listToJson(param.getIdCardUrl()));
        log.debug("保存用户信息时,转换后的idCardUrl:{}",user.getIdCardUrl());
        // 查询用户信息时
       // userVO.setIdCardUrlList(JsonUtils.jsonToList(userVO.getIdCardUrl()));

        Integer rows = userMapper.updateUserInfo(user);
        if (rows != 1){
            throw new ServiceException(StatusCode.FAILED,"修改用户信息失败");
        }
        switch (param.getUserType()) {
            case 1:
                userMapper.insertElderlyInfo(param.getUserId());
                break;

            case 2:
                // 假设 elderlyUserId 和 relationType 来自 param 或其他来源
//                Long elderlyUserId = 0L; // 现在 UserSaveParam 包含此方法
//                userMapper.insertFamilyElderlyRelation(param.getUserId(), elderlyUserId, "default");
                break;

            case 3:
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                String datePart = sdf.format(new Date());
                String seqPart = String.format("%04d", param.getUserId());
                String volunteerNo = datePart+seqPart;
                userMapper.insertVolunteerInfo(param.getUserId(), volunteerNo);
                break;
            default:
                throw new ServiceException(StatusCode.FAILED, "添加用户身份失败");
        }
}





}
